package com.atguigu.team.service;

import com.atguigu.team.domain.Architect;
import com.atguigu.team.domain.Designer;
import com.atguigu.team.domain.Employee;
import com.atguigu.team.domain.Programmer;

/**
 * 关于开发团队成员的管理：添加、删除等
 * @author 石文学
 *
 */
public class TeamService {

	private static int counter = 1;//用来为开发团队新增成员自动生成团队中的唯一ID，即memberid.
	private final int MAx_MEMBER = 5;//表示开发团队最大成员数
	private Programmer team[] = new Programmer[MAx_MEMBER];//用来保存当前团队中的各成员对象
	private int total;//记录团队成员的实际人数
	
	public TeamService() {
		super();
	}

	/**
	 * 获取开发团队中的所有成员
	 * @return
	 */
	public Programmer[] getTeam()
	{
		Programmer newteam[] = new Programmer[total];
		for(int i=0;i<newteam.length;i++)
		{
			newteam[i] = team[i];
		}
		return newteam;
	}
	
	/**
	 * 将指定的员工添加到开发团队中
	 * @param e
	 * @throws TeamException 
	 */
	public void addMember(Employee e) throws TeamException
	{
		//1.成员已满，无法添加
		if(total >= MAx_MEMBER)
		{
			throw new TeamException("成员已满，无法添加");
		}
		//2.该成员不是开发成员，无法添加
		if(!(e instanceof Programmer))
		{
			throw new TeamException("该成员不是开发成员，无法添加");
		}
		//3.该员工已在本开发团队中
		if(isExit(e))
		{
			throw new TeamException("该员工已在本开发团队中");
		}
		//4.该员工已是某团队成员
		//该员工正在休假，无法添加
		Programmer p = (Programmer)e;//一定不会出现ClassCastException
		if("BUSY".equals(p.getStatus().getNAME()))
		{
			throw new TeamException("该员工已是某团队成员");
		}
		else if("VOCATION".equals(p.getStatus().getNAME()))
		{
			throw new TeamException("该员工正在休假，无法添加");
		}
		//团队中至多有一名架构师
		//团队中至多只能有两名设计师
		//团队中至多只能有三名程序员
		//获取team已有成员中架构师、设计师、程序员的人数
		int numOfArc =0,numOfDes =0,numOfPro =0;
		for(int i=0;i<total;i++)
		{
			if(team[i] instanceof Architect)//从范围小的来
			{
				numOfArc++;
			}
			else if(team[i] instanceof Designer)
			{
				numOfDes++;
			}
			else
			{
				numOfPro++;
			}
		}
		
		//判断想新增的的员工是否是符合标准
		//团队中至多有一名架构师
		//团队中至多只能有两名设计师
		//团队中至多只能有三名程序员
		if(p instanceof Architect)
		{
			if(numOfArc >=1)
			{
				throw new TeamException("团队中至多有一名架构师");
			}
		}
		else if(p instanceof Designer)
		{
			if(numOfDes >=2)
			{
				throw new TeamException("团队中至多只能有两名设计师");
			}
		}
		else
		{
			if(numOfPro >=3)
			{
				throw new TeamException("团队中至多只能有三名程序员");
			}
		}
		
		//将p(或e)添加到现有的team中
		team[total++] = p;
		//p的属性赋值
		p.setStatus(Status.BUSY);
		p.setMemberId(counter++);
	}
	
	/**
	 * 判断指定的员工是否已经存在于现有的开发团队中
	 * @param e
	 * @return
	 */
	private boolean isExit(Employee e) {
		for(int i=0;i<total;i++)
		{
			if(team[i].getId() == e.getId())
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * 从团队中删除成员
	 * @param memberId
	 * @throws TeamException 
	 */
	public void removeMember(int memberId) throws TeamException
	{
		int i=0;
		for(;i<total;i++)
		{
			if(team[i].getMemberId() == memberId)
			{
				team[i].setStatus(Status.FREE);
				break;
			}
		}
		//(memberId取值不正常时)
		if(i == total)
		{
			throw new TeamException("找不到指定memberId的员工，删除失败");
		}
		
		//进行删除操作(memberId取值正常时)
		for(int j=i;j<total-1;j++)
		{
			team[j] = team[j+1];
		}
		team[--total] = null;
	}
	
}
